﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>JsonSql.js</title>
    <script type="text/javascript" src="JsonSql.js"></script>
	<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
	<script type="text/javascript">
	var  gp=[];
	var  gpMonth=[];
	var  gpYear=[];
	var  gpYearBefore=[];
        var textStack = []
        document.write = function ()
        {
            JsonSql.From(arguments).ForEach("textStack.push($)");
        }

        function evaluate(code)
        {
            textStack.length = 0;
            var value;
            try
            {
                eval(code + '.Take(1001).WriteLine()');
                value = textStack.join("");
            } catch (e)
            {
                textStack.length = 0;
                try
                {
                    value = eval("(" + code + ")");
                    document.write(value);
                    value = textStack.join("");
                }
                catch (e2)
                {
                    value = "error";
                }
            }
            return value;
        }

        function expand()
        {
            var code = (this.innerText || this.textContent);
            var value = evaluate(code);
            var p = document.createElement("p");
            p.innerHTML = value;
            this.appendChild(p);
            this.onclick = collapse;
        }

        function collapse()
        {
            this.removeChild(this.lastChild);
            this.onclick = expand;
        }

        function execute()
        {
			$.ajax({
				 type: "get",
				 async: false,
				 url: "http://q.stock.sohu.com/hisHq?code="+$("#key").val()+"&start="+$("#start").val()+"&end="+$("#end").val()+"&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp",
				 dataType: "jsonp"
			});
			gp=gp;
            var value = evaluate(this.value);
			//value=value+"<br>日期:"+gp[0][0]+"<br>开盘"+gp[0][1]+"收盘"+gp[0][2]+"涨跌"+gp[0][3]+"涨幅"+gp[0][4]+"<br>最低"+gp[0][5]+"最高"+gp[0][6]+"<br>成交量"+gp[0][7]+"成交额"+gp[0][8]+"换手"+gp[0][9];
            
			gp=gpMonth;
			var valueMonth = evaluate(this.value);
			value=value+ "<br>Month:"+valueMonth;
			//document.getElementById("codeResultMessageMonth").innerHTML = "Month:"+valueMonth;
			
			gp=gpYear;
			var valueYear = evaluate(this.value);
			value=value+ "<br>Year:"+valueYear;
			//document.getElementById("codeResultMessageYear").innerHTML = "Year:"+valueYear;
	
			gp=gpYearBefore;
			var valueYearBefore = evaluate(this.value);
			value=value+"<br>YearBefore:"+valueYearBefore;
			//document.getElementById("codeResultMessageYearBefore").innerHTML = "YearBefore:"+valueYearBefore;
			gp=gp;
			
			document.getElementById("codeResult").innerHTML = value;
        }
		function historySearchHandlerMonth(data){
			gpMonth=data[0].hq;
		}
		function historySearchHandlerYear(data){
			gpYear=data[0].hq;
		}
		function historySearchHandlerYearBefore(data){
			gpYearBefore=data[0].hq;
		}
		function historySearchHandler(data){
			gp=data[0].hq;
		}
		jQuery(document).ready(function(){ 
			$("#start").val(year+month+'01');
			$("#end").val(year+month+dates)
			//各参数的含义为：code：股票代码，以cn_开头，start:起始时间，end：截止时间，
			//stat:统计信息，为0的时候就不返回stat对应的值了，order：排序方法（D表示降序排，A表示升序排），period：数据周期（d表示日线，m表示月线，w表示周线）。
			//返回的数据以这条为例"2018-07-20","61.22","61.83","0.61","1.00%","61.22","62.69","57637","35856.55","0.53%"
			//分别表示日期，开盘，收盘，涨跌，涨幅，最低，最高，成交量，成交额，换手。
			$.ajax({
				 type: "get",
				 async: false,
				 url: "http://q.stock.sohu.com/hisHq?code="+$("#key").val()+"&start="+$("#start").val()+"&end="+$("#end").val()+"&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp",
				 dataType: "jsonp"
			});
			
			$.ajax({
				 type: "get",
				 async: false,
				 url: "http://q.stock.sohu.com/hisHq?code="+$("#key").val()+"&start="+year+monthBefore+"01"+"&end="+year+month+dates+"&stat=1&order=D&period=d&callback=historySearchHandlerMonth&rt=jsonp",
				 dataType: "jsonp"
			});
			
			$.ajax({
				 type: "get",
				 async: false,
				 url: "http://q.stock.sohu.com/hisHq?code="+$("#key").val()+"&start="+year+"0101"+"&end="+year+month+dates+"&stat=1&order=D&period=d&callback=historySearchHandlerYear&rt=jsonp",
				 dataType: "jsonp"
			});
			$.ajax({
				 type: "get",
				 async: false,
				 url: "http://q.stock.sohu.com/hisHq?code="+$("#key").val()+"&start="+yearBefore+"0101"+"&end="+year+month+dates+"&stat=1&order=D&period=d&callback=historySearchHandlerYearBefore&rt=jsonp",
				 dataType: "jsonp"
			});
		});
			//今天是年月日周几
		var arr = ['日','一','二','三','四','五','六',]
		var date =new Date();//记住这个是大写开头的Date
		var year=date.getFullYear();
		var yearBefore=date.getFullYear()-1;
		var month=date.getMonth()+1;
		var monthBefore=date.getMonth();
		var dates=date.getDate();
		var day=date.getDay();
		var days=arr[day];
		console.log('今天是'+year+'年'+month+'月'+dates+'日'+'周'+days);
		if(month<10){month="0"+month;}
		if(monthBefore==0){monthBefore=12;year=year-1;}
		if(monthBefore<10){monthBefore="0"+monthBefore;}
		if(dates<10){dates="0"+dates;}
        window.onload = function ()
        {
            JsonSql.From(document.getElementsByTagName("pre"))
                .ForEach("$.onclick = expand");
            var input = document.getElementById("codeInput");
            input.onkeyup = execute;
            execute.apply(input);
        }

    </script>
    <style type="text/css">
        pre
        {
            cursor: pointer;
        }
        table
        {
            width: 100%;
            border-collapse: collapse;
        }
        td
        {
            border: solid black;
            border-width: 1px 0 1px 0;
        }
        h2
        {
            width: 100%;
        }
    </style>
</head>
<body>
    <h1>
        JsonSql.js-V3.1.0.0</h1>
    <p></p>
    <h2>可以处理对象、Json、数组的筛选、统计、分组等功能，支持方法或sql语句</h2>
		编号<input name="key" value="cn_000776" id="key">601881/000725/000776
		开始<input name="start" value="20200101" id="start">
		结束<input name="end" value="20200319" id="end">
    <table>
        <tr>
            <td style="width: 50%; vertical-align: top">
                <textarea cols="10" rows="10" id="codeInput" style="width: 100%">
				//对象用$.x ,数组用$[index]
				//方法执行,实例一				
				JsonSql.From(gp)
				.Select("{day:$[0],close:$[2]}")
				.Where("$.close == JsonSql.From(gp).Min('$[2]')")
				.ToJSON()

				//语句执行,实例二
				//$JsonSql(" select {day:$[0],close:$[2]} from gp where $.close == JsonSql.From(gp).Min('$[2]')")
				//$JsonSql(" from gp where $[2] == JsonSql.From(gp).Min('$[2]')")
				</textarea>
            </td>
            <td style="vertical-align: top">
                <p id="codeResult" style="padding-left: 20px">
                </p>
				
            </td>
        </tr>
		<!--tr><td>
			<p id="codeResultMessageMonth" style="padding-left: 20px"></p>
		</td></tr>
		<tr><td>
			<p id="codeResultMessageYear" style="padding-left: 20px"></p>
		</td></tr>
		<tr><td>
			<p id="codeResultMessageYearBefore" style="padding-left: 20px"></p>
		</td></tr-->		
    </table>
    <h2 class="clear:both">
        Generating Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
		     <tr>
                <td>
                    Sql
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    params T obj
                </td>
                <td>
                    <pre>JsonSql.Sql(" select * from gp ").ToJSON()</pre>
                    <pre>JsonSql.Sql(" select * from gp ").ToArray()</pre>
					<pre>$JsonSql(" select * from gp ")</pre>
					<pre>$JsonSql(" from gp ")</pre>
					<pre>$JsonSqlToJSON(" select * from gp ")</pre>
					<pre>$JsonSqlToArray(" select * from gp ")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Choice
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    params T obj
                </td>
                <td>
                    <pre>JsonSql.Choice("a","b","c","d").Take(10)</pre>
                    <pre>JsonSql.Choice(["a","b","c","d"]).Take(10)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Cycle
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    params T obj
                </td>
                <td>
                    <pre>JsonSql.Cycle(1,"foo",true).Take(10)</pre>
                    <pre>JsonSql.Cycle([1,"foo",true]).Take(10)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Empty
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Empty()</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="6">
                    From
                </td>
                <td rowspan="6">
                    JsonSql
                </td>
                <td>
                    Array obj
                </td>
                <td>
                    <pre>var arr = [1,124,"aaa",function(){},false];
JsonSql.From(arr)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Object obj
                </td>
                <td>
                    <pre>var obj = {a:3,b:"3",z:function(){},d:true};
JsonSql.From(obj).Select("$.Key + ':' + $.Value")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    NodeList obj
                </td>
                <td>
                    <pre>var node = document.getElementsByTagName("h2");
JsonSql.From(node).Select("$.innerHTML")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Number obj
                </td>
                <td>
                    <pre>JsonSql.From(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String obj
                </td>
                <td>
                    <pre>JsonSql.From("foobar")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    IEnumerable(WSH) obj
                </td>
                <td>
                    <pre>
// using with Windows Script Host
// var fso = WScript.CreateObject("Scripting.FileSystemObject");
// var files = fso.GetFolder("C:\\").Files;
// JsonSql.From(files).Select("$.Name").ForEach("WScript.Echo($)");</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Return
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T element
                </td>
                <td>
                    <pre>JsonSql.Return("foobar")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    Matches
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    string input, RegExp pattern
                </td>
                <td>
                    <pre>JsonSql.Matches("xbcyBCzbc", /(.)bc/i)
.Select("'index='+$.index+' all='+$[0]+' capture='+$[1]")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    string input, string pattern
                </td>
                <td>
                    <pre>JsonSql.Matches("xbcyBCzbc", "(.)bc")
.Select("'index='+$.index+' all='+$[0]+' capture='+$[1]")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    string input, string pattern, string flags
                </td>
                <td>
                    <pre>JsonSql.Matches("xbcyBCzbc", "(.)bc", "i")
.Select("'index='+$.index+' all='+$[0]+' capture='+$[1]")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Range
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    int start, int count
                </td>
                <td>
                    <pre>JsonSql.Range(10,5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start, int count, int step
                </td>
                <td>
                    <pre>JsonSql.Range(10,5,3)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    RangeDown
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    int start, int count
                </td>
                <td>
                    <pre>JsonSql.RangeDown(10,5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start, int count, int step
                </td>
                <td>
                    <pre>JsonSql.RangeDown(10,5,3)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    RangeTo
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    int start, int to
                </td>
                <td>
                    <pre>JsonSql.RangeTo(10,18)</pre>
                    <pre>JsonSql.RangeTo(3,-5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start, int to, int step
                </td>
                <td>
                    <pre>JsonSql.RangeTo(1,9,3)</pre>
                    <pre>JsonSql.RangeTo(1,-9,3)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Repeat
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T obj
                </td>
                <td>
                    <pre>JsonSql.Repeat(3).Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T obj, int count
                </td>
                <td>
                    <pre>JsonSql.Repeat("foo",10)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    RepeatWithFinalize
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T initializer(), void finalizer(T)
                </td>
                <td>
                    <pre>// example for WScript(Text EnumerateLines and Finally Close)
// var fso = WScript.CreateObject("Scripting.FileSystemObject");
// JsonSql.RepeatWithFinalize(
//         function () { return fso.OpenTextFile("C:\\file.txt") },
//         function (ts) { ts.Close() })
//     .TakeWhile(function (ts) { return !ts.AtEndOfStream })
//     .Select(function (ts) { return ts.ReadLine() });
</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Generate
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T func()
                </td>
                <td>
                    <pre>JsonSql.Generate("Math.random()").Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T func(), int count
                </td>
                <td>
                    <pre>JsonSql.Generate("Math.random()", 5)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    ToInfinity
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.ToInfinity().Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start
                </td>
                <td>
                    <pre>JsonSql.ToInfinity(1000).Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start, int step
                </td>
                <td>
                    <pre>JsonSql.ToInfinity(1000,5).Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    ToNegativeInfinity
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.ToNegativeInfinity().Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start
                </td>
                <td>
                    <pre>JsonSql.ToNegativeInfinity(1000).Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    int start, int step
                </td>
                <td>
                    <pre>JsonSql.ToNegativeInfinity(1000,5).Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Unfold
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T seed, T func(T)
                </td>
                <td>
                    <pre>JsonSql.Unfold(5, "$+3").Take(10)</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Projection and Filtering Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="3">
                    CascadeBreadthFirst
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    T[] func(T)
                </td>
                <td>
                    <pre>JsonSql.Return(1).CascadeBreadthFirst("$+$").Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] func(T), T resultSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Return(1).CascadeBreadthFirst("$+$","$*$").Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] func(T), T resultSelector(T, int)
                </td>
                <td>
                    <pre>JsonSql.Return(document.body)
.CascadeBreadthFirst("$.childNodes", "v,n=>{value:v,nestLevel:n}")
.Where("$.nestLevel<3 && $.value.nodeType == 1")
.Select("$.nestLevel + ':' + $.value.tagName")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    CascadeDepthFirst
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    T[] func(T)
                </td>
                <td>
                    <pre>JsonSql.Return(1).CascadeDepthFirst("$+$").Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] func(T), T resultSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Return(1).CascadeDepthFirst("$+$","$*$").Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] func(T), T resultSelector(T, int)
                </td>
                <td>
                    <pre>JsonSql.Return(document.body)
.CascadeDepthFirst("$.childNodes", "v,n=>{value:v,nestLevel:n}")
.Where("$.nestLevel<3 && $.value.nodeType == 1")
.Select("$.nestLevel + ':' + $.value.tagName")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Flatten
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>var array = [1,[234,2,[62,3]],[234,5],3];
JsonSql.From(array).Flatten()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Pairwise
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T selector(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10)
.Pairwise("prev,next=>prev + ':' + next")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    Scan
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    T func(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Scan("a,b=>a+b")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T seed, T func(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Scan(100,"a,b=>a+b")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T seed, T func(T, T), T resultSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Scan(100,"a,b=>a+b","$*10")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Select
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T selector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Select("$*10")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T selector(T, int)
                </td>
                <td>
                    <pre>JsonSql.RangeDown(10,10).Select("value,index=>index + ':' + value")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="4">
                    SelectMany
                </td>
                <td rowspan="4">
                    JsonSql
                </td>
                <td>
                    T[] collectionSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,3).SelectMany("JsonSql.Repeat($,3)")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] collectionSelector(T, int)
                </td>
                <td>
                    <pre>JsonSql.Range(5,5)
.SelectMany("value,index=>JsonSql.Repeat('str'+value,index+1)")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] collectionSelector(T), resultSelector(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,3)
.SelectMany("JsonSql.Repeat($,3)","first,middle=>first + ':' + middle*10")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] collectionSelector(T, int), resultSelector(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(5,5)
.SelectMany("v,i=>JsonSql.Repeat('str'+v,i+1)","f,m=>f + ':' + m")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Where
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Where("$%2==0")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T, int)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Where("value,index=>value*index>10")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    OfType
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    Class type
                </td>
                <td>
                    <pre>JsonSql.From([1,"a",2,"b","c",3]).OfType(Number)</pre>
                    <pre>JsonSql.From([1,"a",2,"b","c",3]).OfType(String)</pre>
                    <pre>function ClassA(v){this.v = v}
JsonSql.From([new ClassA("a"),1,2,new ClassA("b")])
    .OfType(ClassA).Select("$.v")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Zip
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T[] second,T selector(T, T)
                </td>
                <td>
                    <pre>JsonSql.RangeDown(10,10)
.Zip(JsonSql.Range(1,10),"outer,inner=>outer + ':' + inner")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] second,T selector(T, T, int)
                </td>
                <td>
                    <pre>JsonSql.RangeDown(10,10)
.Zip(JsonSql.Range(1,10),"outer,inner,index=>index + ':' + outer*inner")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Join Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="2">
                    Join
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T[] inner, T outerKeySelector(T), T innerKeySelector(T), T resultSelector(T, T)
                </td>
                <td>
                    <pre>var array1 = [13,413,5,135,61,631,13,61,3];
var array2 = [13,134,53,6,3,7,13,7,7,135,61,3,13];
JsonSql.From(array1)
.Join(array2,"","","outer,inner=>outer + ':' + inner")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] inner, T outerKeySelector(T), T innerKeySelector(T), T resultSelector(T, T),
                    T compareSelector(T)
                </td>
                <td>
                    <pre>var array1 = [10,405,50,135];
var array2 = [1,4,7,8];
JsonSql.From(array1)
.Join(array2,"","","outer,inner=>outer + ':' + inner","$%2==0")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    GroupJoin
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T[] inner, T outerKeySelector(T), T innerKeySelector(T), T resultSelector(T, JsonSql)
                </td>
                <td>
                    <pre>var array1 = [13,413,5,135,61,631,13,61,3];
var array2 = [13,134,53,6,3,7,13,7,7,135,61,3,13];
JsonSql.From(array1)
.GroupJoin(array2,"","","outer,lookup=>outer + ':' + lookup.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] inner, T outerKeySelector(T), T innerKeySelector(T), T resultSelector(T, JsonSql),
                    T compareSelector(T)
                </td>
                <td>
                    <pre>var array1 = [10,405,50,135];
var array2 = [1,4,7,8];
JsonSql.From(array1)
.GroupJoin(array2,"","","outer,lookup=>outer + ':' + lookup.ToString('-')","$%2==0")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Set Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    All
                </td>
                <td>
                    Boolean
                </td>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).All("$<5")</pre>
                    <pre>JsonSql.Range(1,10).All("$<15")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Any
                </td>
                <td rowspan="2">
                    Boolean
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,0).Any()</pre>
                    <pre>JsonSql.Range(1,10).Any()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Any("$==5")</pre>
                    <pre>JsonSql.Range(1,10).Any("$==15")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Concat
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T[] second
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Concat(JsonSql.Repeat("foo",5))</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Insert
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    int index, T[] second
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Insert(3,JsonSql.Repeat("foo",5))</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Alternate
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T value
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Alternate(-1)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Contains
                </td>
                <td rowspan="2">
                    Boolean
                </td>
                <td>
                    T value
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Contains(3)</pre>
                    <pre>JsonSql.Range(1,5).Contains(10)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T value, T compareSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Select("{test:$}").Contains(3)</pre>
                    <pre>JsonSql.Range(1,5).Select("{test:$}").Contains(3,"$.test")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    DefaultIfEmpty
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    T defaultValue
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).DefaultIfEmpty("default")</pre>
                    <pre>JsonSql.Range(1,0).DefaultIfEmpty("default")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Distinct
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>var array = [1,412,5,3,5,412,7];
JsonSql.From(array).Distinct()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T compareSelector(T)
                </td>
                <td>
                    <pre>var seq = JsonSql.Range(1,10).Select("{test:$%3}");
seq.Distinct("$.test").Select("$.test")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Except
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T[] second
                </td>
                <td>
                    <pre>var array1 = [1,412,5,3,5,412,7];
var array2 = [20,12,5,5,7,310];
JsonSql.From(array1).Except(array2)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] second, T compareSelector(T)
                </td>
                <td>
                    <pre>var seq1 = JsonSql.Range(1,10).Select("{test:$%5}");
var seq2 = JsonSql.Range(1,10).Select("{test:$%2}");
seq1.Except(seq2,"$.test").Select("$.test")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Intersect
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T[] second
                </td>
                <td>
                    <pre>var array1 = [1,412,5,3,5,412,7];
var array2 = [20,12,5,5,7,310];
JsonSql.From(array1).Intersect(array2)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] second, T compareSelector(T)
                </td>
                <td>
                    <pre>var seq1 = JsonSql.Range(1,10).Select("{test:$%5}");
var seq2 = JsonSql.Range(1,10).Select("{test:$%2}");
seq1.Intersect(seq2,"$.test").Select("$.test")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    SequenceEqual
                </td>
                <td rowspan="2">
                    Boolean
                </td>
                <td>
                    T[] second
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).SequenceEqual(JsonSql.Range(1,5))</pre>
                    <pre>JsonSql.Range(1,5).SequenceEqual(JsonSql.Range(1,6))</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] second, T compareSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Select("{test:$%5}")
.SequenceEqual(JsonSql.Range(1,10).Select("{test:$%5}"),"$.test")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Union
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T[] second
                </td>
                <td>
                    <pre>var array1 = [1,412,5,3,5,412,7];
var array2 = [20,12,5,5,7,310];
JsonSql.From(array1).Union(array2)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T[] second, T compareSelector(T)
                </td>
                <td>
                    <pre>var seq1 = JsonSql.Range(1,5).Select("{test:$}");
var seq2 = JsonSql.Range(3,7).Select("{test:$}");
seq1.Union(seq2,"$.test").Select("$.test")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Ordering Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="2">
                    OrderBy
                </td>
                <td rowspan="2">
                    OrderedEnumerable
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>
var array = [1,51,61,75,8,35,43];
JsonSql.From(array).OrderBy()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T keySelector(T)
                </td>
                <td>
                    <pre>
var array = [{a:"a"},{a:"z"},{a:"k"},{a:"l"},{a:"m"},{a:"c"}];
JsonSql.From(array).OrderBy("$.a").Select("$.a")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    OrderByDescending
                </td>
                <td rowspan="2">
                    OrderedEnumerable
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>
var array = [1,51,61,75,8,35,43];
JsonSql.From(array).OrderByDescending()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T keySelector(T)
                </td>
                <td>
                    <pre>
var array = [{a:"a"},{a:"z"},{a:"k"},{a:"l"},{a:"m"},{a:"c"}];
JsonSql.From(array).OrderByDescending("$.a").Select("$.a")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ThenBy
                </td>
                <td>
                    OrderedEnumerable
                </td>
                <td>
                    T keySelector(T)
                </td>
                <td>
                    <pre>
var list = [
           { a: 2, b: 4, c: 1 },
           { a: 2, b: 3, c: 7 },
           { a: 2, b: 3, c: 3 },
           { a: 4, b: 7, c: 5 },
           { a: 7, b: 3, c: 2 },
           { a: 4, b: 1, c: 5 }];
JsonSql.From(list).OrderBy("$.a").ThenBy("$.c").ThenBy("$.b")
.Select("$.a + ':' + $.b + ':' + $.c")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ThenByDescending
                </td>
                <td>
                    OrderedEnumerable
                </td>
                <td>
                    T keySelector(T)
                </td>
                <td>
                    <pre>
var list = [
           { a: 2, b: 4, c: 1 },
           { a: 2, b: 3, c: 7 },
           { a: 2, b: 3, c: 3 },
           { a: 4, b: 7, c: 5 },
           { a: 7, b: 3, c: 2 },
           { a: 4, b: 1, c: 5 }];
JsonSql.From(list).OrderBy("$.a").ThenByDescending("$.c").ThenByDescending("$.b")
.Select("$.a + ':' + $.b + ':' + $.c")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Reverse
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Reverse()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Shuffle
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Shuffle()</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Grouping Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="4">
                    GroupBy
                </td>
                <td rowspan="2">
                    JsonSql&lt;Grouping>
                </td>
                <td>
                    T keySelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).GroupBy("$%2==0")
.Select("$.Key() + ':' + $.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T keySelector(T), T elementSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).GroupBy("$%2==0","$*10")
.Select("$.Key() + ':' + $.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T keySelector(T), T elementSelector(T), T resultSelector(T, JsonSql)
                </td>
                <td>
                    <pre>JsonSql.Range(1,5)
.GroupBy("$%2==0","","key,e=>key+':'+e.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TK keySelector(T), TE elementSelector(T), TR resultSelector(T, JsonSql),TC compareSelector(TK)
                </td>
                <td>
                    <pre>JsonSql.From([{d:new Date(2000,1,1),i:0},{d:new Date(2000,1,1),i:1}])
.GroupBy("$.d","","key,e=>key+':'+e.Select('$.i').ToArray()","$.toString()")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="4">
                    PartitionBy
                </td>
                <td rowspan="2">
                    JsonSql&lt;Grouping>
                </td>
                <td>
                    T keySelector(T)
                </td>
                <td>
                    <pre>JsonSql.From([1,2,2,3,3,2,1,1]).PartitionBy("i=>i")
.Select("$.Key() + ':' + $.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T keySelector(T), T elementSelector(T)
                </td>
                <td>
                    <pre>JsonSql.From([1,2,2,3,3,2,1,1]).PartitionBy("i=>i","i=>i*100")
.Select("$.Key() + ':' + $.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    T keySelector(T), T elementSelector(T), T resultSelector(T, JsonSql)
                </td>
                <td>
                    <pre>JsonSql.From([1,2,2,3,3,2,1,1])
.PartitionBy("i=>i","i=>i","key,e=>key+':'+e.ToString('-')")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TK keySelector(T), TE elementSelector(T), TR resultSelector(T, JsonSql), TC compareSelector(TK)
                </td>
                <td>
                    <pre>JsonSql.From([{d:new Date(2000,1,1),i:0},{d:new Date(2000,1,1),i:1}])
.PartitionBy("$.d","","key,e=>key+':'+e.Select('$.i').ToArray()","$.toString()")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    BufferWithCount
                </td>
                <td>
                    JsonSql&lt;Array>
                </td>
                <td>
                    int count
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).BufferWithCount(4)</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Aggregate Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="3">
                    Aggregate
                </td>
                <td rowspan="3">
                    T
                </td>
                <td>
                    T func(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Aggregate("a,b=>a*b")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T seed, T func(T, T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Aggregate(100,"a,b=>a+b")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T seed, T func(T, T), T resultSelector(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Aggregate(100,"a,b=>a+b","$*10")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Average
                </td>
                <td rowspan="2">
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Average()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Number selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:5},{a:"bar",b:20},{a:"foobar",b:10}])
.Average("$.b")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Count
                </td>
                <td rowspan="2">
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Count()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Count("$>7")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Max
                </td>
                <td rowspan="2">
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Max()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Number selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:5},{a:"bar",b:20},{a:"foobar",b:10}])
.Max("$.b")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Min
                </td>
                <td rowspan="2">
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Min()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Number selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:5},{a:"bar",b:20},{a:"foobar",b:10}])
.Min("$.b")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    MaxBy
                </td>
                <td>
                    T
                </td>
                <td>
                    Number selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:5},{a:"bar",b:20},{a:"foobar",b:10}])
.MaxBy("$.b").a</pre>
                </td>
            </tr>
            <tr>
                <td>
                    MinBy
                </td>
                <td>
                    T
                </td>
                <td>
                    Number selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:5},{a:"bar",b:20},{a:"foobar",b:10}])
.MinBy("$.b").a</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Sum
                </td>
                <td rowspan="2">
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Sum()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Number selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:5},{a:"bar",b:20},{a:"foobar",b:10}])
.Sum("$.b")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Paging Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    ElementAt
                </td>
                <td>
                    T
                </td>
                <td>
                    int index
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).ElementAt(3)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ElementAtOrDefault
                </td>
                <td>
                    T
                </td>
                <td>
                    int index, T defaultValue
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).ElementAtOrDefault(15,-1)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    First
                </td>
                <td rowspan="2">
                    T
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).First()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).First("$>4")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    FirstOrDefault
                </td>
                <td rowspan="2">
                    T
                </td>
                <td>
                    T defaultValue
                </td>
                <td>
                    <pre>JsonSql.Empty().FirstOrDefault(-1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T defaultValue, bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).FirstOrDefault(-1,"$>15")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Last
                </td>
                <td rowspan="2">
                    T
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Last()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Last("$<4")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    LastOrDefault
                </td>
                <td rowspan="2">
                    T
                </td>
                <td>
                    T defaultValue
                </td>
                <td>
                    <pre>JsonSql.Empty().LastOrDefault(-1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T defaultValue, bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).LastOrDefault(-1,"$>15")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    Single
                </td>
                <td rowspan="2">
                    T
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.From("a").Single()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Single("$==4")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    SingleOrDefault
                </td>
                <td rowspan="2">
                    T
                </td>
                <td>
                    T defaultValue
                </td>
                <td>
                    <pre>JsonSql.Empty().SingleOrDefault(-1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T defaultValue, bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).SingleOrDefault(-1,"$==15")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Skip
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    int count
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Skip(5)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    SkipWhile
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).SkipWhile("$<=5")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T, int index)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).SkipWhile("value,index=>value+index<=5")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Take
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    int count
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Take(5)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    TakeWhile
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    bool predicate(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).TakeWhile("$<=5")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool predicate(T, int index)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).TakeWhile("value,index=>value+index<=5")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    TakeExceptLast
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).TakeExceptLast()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Number count
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).TakeExceptLast(3)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TakeFromLast
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    Number count
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).TakeFromLast(3)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    IndexOf
                </td>
                <td>
                    int
                </td>
                <td>
                    T item
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).IndexOf(3)</pre>
                    <pre>JsonSql.Range(1,10).IndexOf(15)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    LastIndexOf
                </td>
                <td>
                    int
                </td>
                <td>
                    T item
                </td>
                <td>
                    <pre>JsonSql.From([1,2,3,2,5]).LastIndexOf(2)</pre>
                    <pre>JsonSql.From([1,2,3,2,5]).LastIndexOf(20)</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Convert Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    ToArray
                </td>
                <td>
                    Array
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).ToArray()</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    ToLookup
                </td>
                <td rowspan="3">
                    Lookup
                </td>
                <td>
                    TKey keySelector(T)
                </td>
                <td>
                    <pre>var lookup = JsonSql.From(["temp.xls", "temp.pdf", "temp.jpg", "temp2.pdf"])
.ToLookup("$.match(/\\.(.+$)/)[1]");
lookup.ToEnumerable().Select("$.Key() + ' : ' + $.ToArray()")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TKey keySelector(T), TElement elementSelector(T)
                </td>
                <td>
                    <pre>var lookup = JsonSql.From(["temp.xls", "temp.pdf", "temp.jpg", "temp2.pdf"])
.ToLookup("$.match(/\\.(.+$)/)[1]","$.match(/(.+)\\.[^.]+$/)[1]");
lookup.ToEnumerable().Select("$.Key() + ' : ' + $.ToArray()")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TKey keySelector(T), TElement elementSelector(T), TCompare compareSelector(TKey)
                </td>
                <td>
                    <pre>var lookup = JsonSql.From(["temp.xls", "temp.pdf", "temp.jpg", "temp2.pdf"])
.ToLookup("","","$.match(/\\.(.+$)/)[1]");
lookup.ToEnumerable().Select("$.Key() + ' : ' + $.ToArray()")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ToObject
                </td>
                <td>
                    Object
                </td>
                <td>
                    String keySelector(T), T elementSelector(T)
                </td>
                <td>
                    <pre>var obj = JsonSql.Range(1,10).Select("value,index=>{id:'id_' + index,value:value}")
.ToObject("$.id","$.value");
JsonSql.From(obj).Select("$.Key + ':' + $.Value")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    ToDictionary
                </td>
                <td rowspan="2">
                    Dictionary
                </td>
                <td>
                    TKey keySelector(T), TElement elementSelector(T)
                </td>
                <td>
                    <pre>var dict = JsonSql.Range(1,10).Select("value,index=>{id:'id_' + index,value:value}")
.ToDictionary("$.id","$.value");
dict.ToEnumerable().Select("$.Key + ':' + $.Value")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TKey keySelector(T), TElement elementSelector(T), TCompare compareSelector(TKey)
                </td>
                <td>
                    <pre>var dict = JsonSql.Range(1,10).Select("value,index=>{id:'id_' + index,value:value}")
.ToDictionary("$","$.value","$;id");
dict.ToEnumerable().Select("$.Key.id + ':' + $.Value")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    ToJSON
                </td>
                <td rowspan="3">
                    String
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>// ToJSON only work Native JSON support browser or include json2.js
JsonSql.From([{Foo:1, Bar:'z'},{Foo:5, Bar:null}]).ToJSON()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TResult replacer(TKey, TValue)
                </td>
                <td>
                    <pre>JsonSql.From(["a","b","c"])
.ToJSON(function(k,v){return (typeof v === 'object') ? v : v.toString().toUpperCase()})</pre>
                </td>
            </tr>
            <tr>
                <td>
                    TResult replacer(TKey, TValue), Number space
                </td>
                <td>
                    <pre>JsonSql.Range(1, 5).ToJSON(null, 4)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    ToString
                </td>
                <td rowspan="3">
                    String
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(0,10).ToString()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String separator
                </td>
                <td>
                    <pre>JsonSql.Range(0,10).ToString("-")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String separator, T selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{k:"foo"},{k:"bar"}]).ToString("-","$.k")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Action Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="2">
                    Do
                </td>
                <td rowspan="2">
                    JsonSql
                </td>
                <td>
                    void action(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Do(function(i){
    document.write('do:'+ i +'|');})
 .Where("$%2==0")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    void action(T, index)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Do(function(value,index){
    document.write("do:" + index + '-' + value + "&lt;br/>");})
.OrderBy("").Take(2)</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="4">
                    ForEach
                </td>
                <td rowspan="4">
                    void
                </td>
                <td>
                    void action(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).ForEach(function(i){
    document.write(i);})</pre>
                </td>
            </tr>
            <tr>
                <td>
                    void action(T, index)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).ForEach(function(value,index){
    document.write(index + ':' + value + "&lt;br/>");})</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool func(T)
                </td>
                <td>
                    <pre>JsonSql.Range(1, 10).ForEach(function(i)
{
    if (i % 2 == 0) return; // continue
    if (i > 6) return false; // break
    document.write(i + "&lt;br/>");
})</pre>
                </td>
            </tr>
            <tr>
                <td>
                    bool func(T, index)
                </td>
                <td>
                    <pre>JsonSql.Repeat("aaa", 10).ForEach(function(s,index)
{
    if (index % 2 == 0) return; // continue
    if (index > 6) return false; // break
    document.write(index + s + "&lt;br/>");
})</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="3">
                    Write
                </td>
                <td rowspan="3">
                    void
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Write()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String separator
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Write("-")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String separator, T selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:1},{a:"bar",b:3}])
.Write("-","$.a + ':' + $.b")</pre>
                </td>
            </tr>
            <tr>
                <td rowspan="2">
                    WriteLine
                </td>
                <td rowspan="2">
                    void
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).WriteLine()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    T selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:1},{a:"bar",b:3}])
.WriteLine("$.a + ':' + $.b")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Force
                </td>
                <td>
                    void
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Trace().Force()</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Functional Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    Let
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    JsonSql&lt;TR> func(JsonSql&lt;T>)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Let(function(x){return x.Zip(x.Skip(1),"x,y=>x + ':' + y")})</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Share
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>var share = JsonSql.Range(1,10).Share();
share.Take(4).WriteLine();
document.write("--- &lt;br>");
share.Skip(2)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    MemoizeAll
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>var mem = JsonSql.Range(1,10)
.Do("document.write('--->' + $ + '&lt;br>')").MemoizeAll();
mem.Where("$%2==0").WriteLine();
document.write("--- &lt;br>");
mem.Where("$%2==0")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Error Handling Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    Catch
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    void handler(Error)
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Select(function(i){
    if(i == 5) throw new Error("enumerable_error"); else return i;})
.Catch("document.write($.message)")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Finally
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    void finallyAction()
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).Finally(function(){document.write("finally")})</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        For Debug Methods</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td rowspan="3">
                    Trace
                </td>
                <td rowspan="3">
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>// Trace is output to console.log
JsonSql.Range(1,10).Trace().Force()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String message
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).Trace("Gen").Where("$%3==0").Trace("Filtered").Force()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    String message, T selector(T)
                </td>
                <td>
                    <pre>JsonSql.From([{a:"foo",b:1},{a:"bar",b:3}])
.Trace("Gen","$.a").Force()</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        IEnumerator</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    GetEnumerator
                </td>
                <td>
                    IEnumerator
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).GetEnumerator()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    MoveNext
                </td>
                <td>
                    Boolean
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).GetEnumerator().MoveNext()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Current
                </td>
                <td>
                    T
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).GetEnumerator().Current()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Dispose
                </td>
                <td>
                    void
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,10).GetEnumerator().Dispose()</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Dictionary</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    Add
                </td>
                <td>
                    void
                </td>
                <td>
                    TKey key, TValue value
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Add(1, 'aaa')</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Get
                </td>
                <td>
                    TValue
                </td>
                <td>
                    TKey key
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Get(1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Set
                </td>
                <td>
                    Boolean
                </td>
                <td>
                    TKey key, TValue value
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Set(1, 'zzz')</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Contains
                </td>
                <td>
                    Boolean
                </td>
                <td>
                    TKey key
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Contains(1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Clear
                </td>
                <td>
                    void
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Clear()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Remove
                </td>
                <td>
                    void
                </td>
                <td>
                    TKey key
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Remove(1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Count
                </td>
                <td>
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Empty().ToDictionary().Count()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ToEnumerable
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>var dict = JsonSql.Empty().ToDictionary();
dict.Add("foo", 10); dict.Add("bar", 200);
dict.ToEnumerable().Select("$.Key + ':' + $.Value")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Lookup</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    Get
                </td>
                <td>
                    JsonSql&lt;TElement>
                </td>
                <td>
                    TKey key
                </td>
                <td>
                    <pre>JsonSql.From([{x:1,s:'a'},{x:1,s:'z'}])
.ToLookup("$.x").Get(1).Select("$.x + ':' + $.s")</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Contains
                </td>
                <td>
                    Boolean
                </td>
                <td>
                    TKey key
                </td>
                <td>
                    <pre>JsonSql.From([{x:1,s:'a'},{x:1,s:'z'}])
.ToLookup("$.x").Contains(1)</pre>
                </td>
            </tr>
            <tr>
                <td>
                    Count
                </td>
                <td>
                    Number
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.Range(1,5).ToLookup().Count()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ToEnumerable
                </td>
                <td>
                    JsonSql&lt;Grouping>
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.From([{a:1,s:'foo'},{a:1,s:'bar'},{a:2,s:'zzzzz'}])
.ToLookup("$.a").ToEnumerable()
.Select("$.Key() + ':' + $.Select('$.s').ToString('-')")</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        Grouping(inherit Eunmerable)</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
            <tr>
                <td>
                    Key
                </td>
                <td>
                    TKey
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>JsonSql.From([{id:"foo",x:10},{id:"bar",x:20},{id:"foo",x:100}])
.GroupBy("$.id").ToArray()[0] // grouping
.Key()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    All JsonSql Methods
                </td>
                <td>
                    -
                </td>
                <td>
                    -
                </td>
                <td>
                    <pre>var grouping = JsonSql.From([{id:"foo",x:10},{id:"foo",x:25},{id:"foo",x:100}])
.GroupBy("$.id").ToArray()[0];
grouping.Where("$.x % 10 == 0").Select("$.id + ':' + $.x")</pre>
                </td>
            </tr>
        </thead>
    </table>
    <h2>
        jQuery plugin</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    TojQuery
                </td>
                <td>
                    jQuery
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>// JsonSql.Repeat("foo",10).TojQuery()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    toEnumerable
                </td>
                <td>
                    JsonSql&lt;jQuery>
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>// $("div").toEnumerable()</pre>
                </td>
            </tr>
        </tbody>
    </table>
    <h2>
        RxJS Binding</h2>
    <table>
        <thead>
            <tr>
                <td>
                    method name
                </td>
                <td>
                    return type
                </td>
                <td>
                    arguments
                </td>
                <td>
                    example (click code)
                </td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    ToObservable
                </td>
                <td>
                    Rx.Observable
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>// JsonSql.Range(1,10).ToObservable()</pre>
                </td>
            </tr>
            <tr>
                <td>
                    ToEnumerable
                </td>
                <td>
                    JsonSql
                </td>
                <td>
                    ()
                </td>
                <td>
                    <pre>// Rx.Observable.Range(1,10).ToEnumerable()</pre>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>
